#include <iostream>
using namespace std;

template <class T>
T add(T x, T y)
{
    return x + y;
}

template <class ...Args>//Args 模板参数包
void display(Args ...args)//args 函数参数包
{
    //输出模板参数包中类型参数个数
    cout << "sizeof...(Args) = " << sizeof...(Args) << endl;
    //输出函数参数包中参数的个数
    cout << "sizeof...(args) = " << sizeof...(args) << endl;
}

//递归的出口
void print(){
    cout << endl;
}

//重新定义一个可变参数模板，至少得有一个参数
template <class T,class ...Args>
void print(T x, Args ...args)
{
    cout << x << " ";
    print(args...);  //省略号在参数包右边
}

void printType(){
    cout << endl;
}

//重新定义一个可变参数模板，至少得有一个参数
template <class T,class... Args>
void printType(T x, Args... args)
{
    cout << typeid(x).name() << " ";
    printType(args...);
}

void test0(){
    display();
    display(1,"hello",3.3,true,5);
    print(1,"hello",3.3,true,5);
    cout << endl;

    printType(1,"hello",3.3,true,5);
}

int main(void){
    test0();
    return 0;
}